/*
 * funcionesPPD.c
 *
 *  Created on: 25/09/2011
 *      Author: utn_so
 */

#include "main.h"

int32_t calcularDireccion(int32_t unSector)
	{
	int32_t iDirARetornar;
	iDirARetornar = unSector * TAMSECTOR;


	return iDirARetornar;
	}

int32_t abrirMapearArchivoDisco (char* path, char** archivoMapeado)
{
    int32_t fileDescriptor;
    int32_t statusOk =0;
    struct stat stStatusArchivo;

	if((fileDescriptor = open (path,O_RDWR)) <= 0)
        {
        printf ("Error al abrir el archivo");
		return 0;
        }

	statusOk = fstat(fileDescriptor, &stStatusArchivo);
	*archivoMapeado = NULL;

    *archivoMapeado = mmap((caddr_t)0,stStatusArchivo.st_size,PROT_WRITE, MAP_SHARED,fileDescriptor,(off_t)0);
    if (*archivoMapeado == (caddr_t)-1)
    {
    	perror("mmap() error");

    	return -1;
    }

    return fileDescriptor;
}


int32_t cerrarArchivoMapeado(char** archivoMapeado, int32_t fileDescriptor)
{
/* Si Hago primero el munmap estoy perdiendo el archivo, Revisar donde deberia ir */
	int32_t closeOk;
	struct stat stStatusArchivoCerrar;
	int32_t statusOk = 0;
	statusOk = fstat(fileDescriptor, &stStatusArchivoCerrar);

	if((closeOk = munmap(*archivoMapeado,stStatusArchivoCerrar.st_size)) != 0)
    	{
    		printf("Error Al Hacer unmap\n");
    		return Retorno_Error;
    	}

	 if ((closeOk = close(fileDescriptor))!=0)
	    {
	    	printf("Error En el Close\n");
	    	return Retorno_Error;
	    }

	 *archivoMapeado = NULL;
	 return Retorno_OK;
}

int32_t leerSector(char *archivoMapeado, int32_t iNumeroSector,void *vDatosAretornar)
{
    int32_t iDirALeer;

	iDirALeer = calcularDireccion(iNumeroSector);

	memcpy(vDatosAretornar,archivoMapeado + iDirALeer, TAMSECTOR);

	return Retorno_OK;

}

int32_t escribirSector(char *archivoMapeado, int32_t iNumeroSector,char *vDatosAEscribir)
{
    int32_t iDirAEscribir;


	iDirAEscribir = calcularDireccion(iNumeroSector);

	memcpy(archivoMapeado + iDirAEscribir, vDatosAEscribir, strlen(vDatosAEscribir));

	msync(archivoMapeado + iDirAEscribir, strlen(vDatosAEscribir), MS_ASYNC);

	return Retorno_OK;

}
